Хочете покращити цю публікацію? Надайте докладні відповіді на це питання, включаючи цитати та пояснення, чому ваша відповідь правильна. Відповіді без достатньої деталізації можна редагувати або видаляти. Я помилково додав файли до Git за допомогою команди: git додати myfile.txt Я ще не запустив git commit. Чи є спосіб скасувати це, тому ці файли не будуть включені до коміту?
2020-12-07 21:22:19
1 2 Далі Ви можете скасувати git add перед комітом за допомогою git reset <файл> який вилучить його з поточного індексу (список "що буде здійснено"), не змінюючи нічого іншого. Можна використовувати Git скинути без будь-якого імені файлу, щоб зняти всі належні зміни. Це може стати в нагоді, коли файлів занадто багато, щоб їх можна було перерахувати по одному за розумний проміжок часу. У старих версіях Git вищезазначені команди еквівалентні git reset HEADта git reset HEAD відповідно, і не зможуть, якщо HEAD невизначений (оскільки ви ще не зробили жодного коміту у вашому сховищі) або неоднозначний (тому що ви створив гілку під назвою HEAD, що нерозумно, що не слід робити). Однак це було змінено в Git 1.8.2, тому в сучасних версіях Git ви можете використовувати наведені вище команди навіть до першого коміту: "git reset" (без опцій або параметрів), що використовується для помилки, коли у вас немає жодної комісії у вашій історії, але тепер вона дає вам порожній індекс (для відповідності неіснуючому коміту ви навіть не перебуваєте). Документація: Git reset | Ти хочеш: git rm --cached Міркування: Коли я був новачком у цьому, я вперше спробував Git скинути. (для скасування мого первісного додавання), лише для отримання цього (не такого) корисного повідомлення: fatal: Не вдалося вирішити "HEAD" як дійсний номер. Виявляється, це тому, що посилання HEAD (гілка?) Існує лише після першого коміту. Тобто, ви зіткнетеся з тією ж проблемою для початківців, що і я, якби ваш робочий процес, як і мій, був приблизно таким: cd до мого чудового нового каталогу проектів, щоб спробувати Git, нову гарячість git init git add. git статус ... безліч дерьмових сувоїв від ... => Блін, я не хотів додавати все це. google "скасувати додавання git" => знайти переповнення стека - yay Git скинути. => fatal: Не вдалося вирішити "HEAD" як дійсний номер. Далі виявляється, що в списку розсилки зареєстрована помилка проти її непотрібності. І що правильне рішення було саме там, у виведенні статусу Git (що, так, я маскував як "лайно) ... # Зміни, які потрібно здійснити: # (використовуйте "git rm --cached ...", щоб відключити) ... І рішення насправді полягає у використанні git rm --cached FILE. Зверніть увагу на попередження деінде тут - git rm видаляє вашу локальну робочу копію файлу, але не якщо ви використовуєте --cached. Ось результат git help rm: - кешовано Використовуйте цей параметр, щоб зняти стадію та видалити шляхи лише з індексу. Залишаться робочі файли дерев, незалежно від того, модифіковані вони чи ні. Приступаю до використання git rm --кешовано. щоб видалити все і почати спочатку. Не вдалося, хоча додати. є рекурсивним, виявляється, що rm потребує -r, щоб повторити. Зітхайте. git rm -r --кешований. Добре, зараз я повернувся до того, з чого почав. Наступного разу я буду використовувати -n, щоб зробити сухий запуск і подивитися, що буде додано: git add -n. Я заархівував все в безпечне місце, перш ніж довіряти git help rm про те, що --cached нічого не знищує (а що, якщо я неправильно написав). | Якщо ви вводите: git статус Git розповість вам про те, що інсценовано тощо, включаючи вказівки щодо того, як вивести з ладу: використовуйте "git reset HEAD ...", щоб відключити Я вважаю, що Git робить досить хорошу роботу, підштовхуючи мене до того, щоб я вчинив правильно в таких ситуаціях. Примітка: Останні версії Git (1.8.4.x) змінили це повідомлення: (використовуйте "git rm --cached ...", щоб відключити) | Для уточнення: git add переміщує зміни з поточного робочого каталогу в область проходження (індекс). Цей процес називається інсценуванням. Отже, найбільш природна команда для поетапного внесення змін (змінених файлів) є очевидною: git етап git add - це просто простіший у наборі псевдонім для git stage Шкода, що немає команд git unstage і git unadd. Відповідний важче вгадати чи запам'ятати, але це досить очевидно: git reset HEAD - Ми можемо легко створити для цього псевдонім: git config --global alias.unadd 'скинути HEAD -' git config --global alias.unstage 'reset HEAD -' І нарешті, у нас є нові команди: git додати файл1 файл git stage2 git unadd файл2 файл git unstage1 Особисто я використовую ще коротші псевдоніми: git a # Для постановки git u # Для зняття інсталяції | Додатком до прийнятої відповіді є те, що якщо ваш помилково доданий файл був величезним, ви, напевно, помітите, що навіть після видалення його з індексу за допомогою 'git reset', він все одно займає місце в каталозі .git. Про це не варто турбуватися; файл справді все ще знаходиться у сховищі, але лише як "вільний об'єкт". Він не буде скопійований до інших сховищ (через клон, push), і простір буде врешті рекультивовано - хоча, можливо, не дуже скоро. Якщо ви стурбовані, можете запустити: git gc --prune = зараз Оновлення (далі йдеться про мою спробу усунути певну плутанину, яка може виникнути з найбільш прихильних відповідей): Отже, що є справжнім скасуванням git add? git reset HEAD <файл>? або git rm --cached <файл>? Строго кажучи, і якщо я не помиляюся: жодного. git add не можна скасувати - загалом безпечно. Давайте спочатку згадаємо, що насправді робить git add : Якщо раніше не відстежувався, git add додає його докеш, з його поточним вмістом. Якщо вже було відстежено, git add зберігає поточний вміст (знімок, версія) до кешу. У Git ця дія все ще називається додаванням, (а не просто його оновленням), оскільки дві різні версії (знімки) файлу розглядаються як два різні елементи: отже, ми дійсно додаємо новий елемент до кешу, який з часом буде скоєні пізніше. У світлі цього питання трохи неоднозначне: Я помилково додав файли за допомогою команди ... Сценарій OP здається першим (файл, який не відстежується), ми хочемо, щоб "скасувати" видалив файл (а не лише поточний вміст) із відстежуваних елементів. Якщо це так, то нормально запустити git rm --cached <файл>. І ми також можемо запустити git reset HEAD <файл>. Це загалом переважно, оскільки воно працює в обох сценаріях: воно також скасовує, коли ми помилково додали версію вже відстежуваного елемента. Але є два застереження. По-перше: Існує (як зазначено у відповіді) лише один сценарій, коли git reset HEAD не працює, але git rm --cached працює: нове сховище (без комітів). Але, насправді, це практично неістотний випадок. По-друге: майте на увазі, що git reset HEAD не може магічним чином відновити раніше кешований вміст файлу, він просто ресинхронізує його з HEAD. Якщо наш помилковий git add перезаписав попередню інсценізовану незв'язану версію, ми не можемо її відновити. Ось чому, строго кажучи, ми не можемо скасувати [*]. Приклад: $ git init $ echo "версія 1"> file.txt $ git add file.txt # Перше додавання file.txt $ git commit -m 'перший коміт' $ echo "версія 2"> file.txt $ git add file.txt # Етап (не фіксувати) "версія 2" файлу.txt $ git diff --cached file.txt -версія 1 + версія 2 $ echo "версія 3"> file.txt $ git diff file.txt -версія 2 + версія 3 $ git add file.txt # На жаль, ми не мали цього на увазі $ git reset HEAD file.txt # Скасувати? $ git diff --cached file.txt # Звичайно, немає розбіжностей. етап == ГОЛОВА $ git diff file.txt # Ми безповоротно втратили "версію 2" -версія 1 + версія 3 Звичайно, це не дуже важливо, якщо ми просто дотримуємося звичайного лінивого робочого процесу, виконуючи 'git add' лише для додавання нових файлів (випадок 1), і ми оновлюємо новий вміст за допомогою команди commit, git commit -a. * (Редагувати: вищезазначене практично правильне, але все ж можуть існувати деякі зловмисні / заплутані способи відновлення змін, які були здійснені, але не скоєні, а потім перезаписані - див. Коментарі Йоганнеса Матокіча та iolsmit) | Скасувати вже доданий файл досить просто за допомогою Git. Для скидання myfile.txt, який вже був доданий, використовуйте: git reset HEAD myfile.txt Пояснення: Після того, як ви скасували небажані файли, щоб скасувати їх, ви можете виконати Git reset. Head - це заголовок вашого файлу в локальній мережі, а останній параметр - це ім'я вашого файлу. Я створив кроки на зображенні нижче для більш детальної інформації для вас, включаючи всі кроки, які можуть відбутися в таких випадках: | git rm --кешовано. -r буде "скасовувати" все, що ви додали із поточного каталогу, рекурсивно | Біжи git gui і видаліть усі файли вручну або виділивши їх і натиснувши кнопку зняття з коміту. | Питання не поставлене чітко. Причина в тому, що git add має два значення: додавання нового файлу до індексної області, а потім скасувати за допомогою git rm --cached файл. додавши модифікований файл до проміжної області, а потім скасуйте за допомогою git reset HEAD файл. Якщо ви сумніваєтесь, використовуйте git скинути файл HEAD Тому що це робить очікуване в обох випадках. Попередження: якщо ви робите файл git rm --cached у файлі, який був змінений (файл, який раніше існував у сховищі), тоді файл буде видалений при git commit! Він все ще буде існувати у вашій файловій системі, але якщо хтось інший витягне ваш коміт, файл буде видалений зі свого робочого дерева. git status покаже вам, чи був файл новим або зміненим: На майстрі гілки Необхідні зміни: (використовуйте "git reset HEAD ...", щоб відключити) новий файл: my_new_file.txt змінено: my_modified_file.txt | Git має команди для кожної дії, яку тільки можна собі уявити, але йому потрібні великі знання, щоб все виправити, і завдяки цьому він у кращому випадку інтуїтивний ... Що ви робили раніше: Змінив файл і використовував git add., Або git add . Що ти хочеш: Видаліть файл із індексу, але збережіть його версію та залиште незаблоковані зміни в робочій копії: git reset HEAD <файл> Скиньте файл до останнього стану з HEAD, скасувавши зміни та видаливши їх з індексу: # Подумайте `svn revert ` IIRC. git reset HEAD <файл> git checkout <файл> # Якщо у вас є ` ` з іменем, як ` `, використовуйте: git checkout - <файл> Це потрібно, оскільки git reset - hard HEAD не працюватиме з окремими файлами. Видаліть з індексу та версій, зберігаючи неверсійний файл із змінами в робочій копії: git rm --cached <файл> Повністю видаліть з робочої копії та версій: git rm <файл> | Якщо ви виконуєте початковий коміт і не можете використовувати gitскиньте налаштування, просто оголосіть "банкрутство Git", видаліть папку .git і починайте спочатку | Як і на багато інших відповідей, ви можете використовувати git reset АЛЕ: Я знайшов цей чудовий маленький пост, який насправді додає команду Git (ну, псевдонім) для git unadd: див. Git unadd для деталей або .. Просто, git config --global alias.unadd "скинути HEAD" Тепер ти можеш git unadd foo.txt bar.txt | Використовуйте git add -i, щоб видалити щойно додані файли з вашого майбутнього коміту. Приклад: Додавання файлу, який ви не хотіли: $ git add foo $ git статус # Про майстра гілки # Зміни, які потрібно здійснити: # (використовуйте "git reset HEAD ..." для вимкнення) # # новий файл: foo # # Файли, що не відслідковуються: # (використовуйте "git add ...", щоб включити в те, що буде здійснено) # [...] # Перехід до інтерактивного додавання, щоб скасувати додавання (команди, введені в git тут: "r" (повернути), "1" (перший запис у списку, що відображає повернення), "return", щоб вийти з режиму повернення, і "q" (вийти): $ git add -i інсценізований інсценований шлях 1: + 1 / -0 нічого *** Команди *** 1: [s] татус 2: [u] дата 3: [r] еверт 4: [a] dd без відстеження 5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp Що тепер> р інсценізований інсценований шлях 1: + 1 / -0 нічого [f] oo Повернути >> 1 інсценізований інсценований шлях * 1: + 1 / -0 нічого [f] oo Повернути >> Примітка: foo зараз не відстежується. повернув один шлях *** Команди *** 1: [s] татус 2: [u] дата 3: [r] еверт 4: [a] dd без відстеження 5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp Що зараз> q До побачення. $ Це воно! Ось ваш доказ, який показує, що "foo" знову в списку без відстеження: $ git статус # Про майстра гілки # Файли, що не відслідковуються: # (використовуйте "git add ...", щоб включити в те, що буде здійснено) # [...] # foo нічого не додано до коміту, але наявні невідстежені файли (використовуйте "git add" для відстеження) $ | Для цього можна використовувати git remove або git rm із позначкою --cached. Спробуйте: git help rm - - | Ось спосіб уникнути цієї неприємної проблеми при запуску нового проекту: Створіть основний каталог для вашого нового проекту. Запустіть git init. Тепер створіть файл .gitignore (навіть якщо він порожній). Зафіксуйте файл .gitignore. Git дуже важко зробити скидання git, якщо у вас немає жодних комітів. Якщо ви створюєте крихітний початковий коміт лише для того, щоб його мати, після цього ви можете git add -A та git reset скільки завгодно разів, щоб все було правильно. Ще однією перевагою цього методу є те, що якщо пізніше у вас виникають проблеми із закінченням рядка, і вам потрібно оновити всі файли, це легко: Перевірте це початкове комітування. Це видалить усі ваші файли. Потім ще раз перевірте останню коміту. Це дозволить отримати свіжі копії ваших файлів, використовуючи поточні налаштування закінчення рядка. | Можливо, Git еволюціонував з тих пір, як ви опублікували своє запитання. $> git --version git версія 1.6.2.1 Тепер ви можете спробувати: git скинути HEAD. Це має бути те, що ви шукаєте. | Зверніть увагу, що якщо вам не вдається вказати редакцію, вам доведеться включити роздільник. Приклад з моєї консолі: git reset fatal: неоднозначний аргумент ' ': невідома редакція або шлях, що не знаходиться в робочому дереві. Використовуйте '-', щоб відокремити шляхи від версій git reset - <шлях_файлу> Нестадійні зміни після скидання: M <шлях_файлу> (Версія Git 1.7.5.4) | Щоб видалити нові файли з проміжної області (і лише у випадку з новим файлом), як запропоновано вище: git rm --кешований ФАЙЛ Використовуйте rm --cached лише для випадково доданих нових файлів. | Щоб скинути кожен файл у певній папці (та її підпапках), можна скористатися наступною командою: скидання git * | Використовуйте команду * для обробки кількох файлів одночасно: git reset HEAD * .prj git reset HEAD * .bmp git reset HEAD * gdb * тощо | Просто введіть git reset, він повернеться назад, і це схоже на те, що ви ніколи не вводили git add. з моменту останньої комісії. Переконайтеся, що ви вже скоювались раніше. | Припустимо, я створив новий файл, newFile.txt: Припустимо, я додаю файл випадково, git add newFile.txt: Тепер я хочу скасувати це додавання, перед комітом, git reset newFile.txt: | Для конкретного файлу: git скинути my_file.txt git checkout my_file.txt Для всіх доданих файлів: Git скинути. git перевірка. Примітка: checkout змінює код у файлах і переходить до останнього оновленого (зафіксованого) стану. скидання не змінює коди; він просто скидає заголовок. | Щоб скасувати git add, використовуйте: git скинути ім'я файлу | Ця команда скасує зміни: git reset HEAD filename.txt Ви також можете використовувати git add -p додати частини файлів. | Існує також інтерактивний режим: git add -i Виберіть варіант 3, щоб скасувати додавання файлів. У моєму випадку я часто хочу додати більше одного файлу, а в інтерактивному режимі ви можете використовувати такі цифри для додавання файлів. Для цього знадобляться всі, крім 4: 1, 2, 3 та 5 Щоб вибрати послідовність, просто введіть 1-5, щоб взяти всі від 1 до 5. Постановочні файли Git | git add myfile.txt # Це додасть ваш файл до списку, який буде зроблено Цілком протилежною цій команді є: git reset HEAD myfile.txt # Це скасуєце. отже, ви опинитесь у попередньому стані. Вказане буде знову в невідстеженому списку (попередній стан). Він скине вашу голову за допомогою вказаного файлу. отже, якщо у вашій голові цього немає, він просто скине його. | git скинути ім'я файлу.txt Видалить файл із назвою filename.txt із поточного індексу, області "про те, що буде здійснено", не змінюючи нічого іншого. | git скинути ім'я файлу.txt Видалить файл із назвою filename.txt із поточного індексу, області "про те, що буде здійснено", не змінюючи нічого іншого. | У Sourcetree ви можете легко це зробити за допомогою графічного інтерфейсу. Ви можете перевірити, яку команду Sourcetree використовує для зняття файлу з файлу. Я створив новий файл і додав його до Git. Потім я зняв його зі сцени за допомогою графічного інтерфейсу Sourcetree. Ось результат: Видалення файлів [08/12/15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - path / to / file / filename.java Sourcetree використовує скидання для виведення нових файлів з ладу. | 1 2 Далі Високоактивне запитання. Заробіть 10 репутації, щоб відповісти на це питання. Вимога про репутацію допомагає захистити це питання від спаму та відсутності відповідей. Не відповідь, яку ви шукаєте? Перегляньте інші запитання з тегом git-control version git-commit git-stage або задайте власне запитання.